import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'

// 关闭进度条
NProgress.configure({ showSpinner: false })
// 免登录白名单
const whiteList = ['/login']

// 路由守卫，判断是否有权限访问该路由，由router.beforeEach()调用，
router.beforeEach(async(to, from, next) => {

  // 用于控制进度条的显示和隐藏
  NProgress.start()
  // 用于控制页面title的显示
  document.title = getPageTitle(to.meta.title)

  // 调用getToken方法，获取token
  const hasToken = getToken()
  // 如果有token，则判断是否有用户信息，
  // 如果有信息，则放行，如果没有信息，则获取用户信息

  if (hasToken) {
    if (to.path === '/login') {

      // 重定向到首页
      next({ path: '/' })
      NProgress.done()
      
    } else {

      // 使用store.getters.roles来判断用户是否有访问该路由的权限
      const hasGetUserInfo = store.getters.name

      if (hasGetUserInfo) {
        next()
      } else {
        try {

          // 调用getUserInfo方法，获取用户信息
          await store.dispatch('user/getInfo')
          // 放行
          next()

        } catch (error) {

          // 出错则重定向到登录页面，重置token
          // 调用resetToken方法，重置token
          await store.dispatch('user/resetToken')
          // 如果出错，则显示错误信息，不出错则不显示
          Message.error(error || 'Has Error')
          // 重定向到登录页面
          next(`/login?redirect=${to.path}`)
          // 关闭进度条
          NProgress.done()

        }
      }
    }
  } else {

    // 没有token，则判断是否在免登录白名单中，
    // 如果在，则放行，如果不在，则重定向到登录页面
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单中，则放行
      next()
    } else {
      // 不在免登录白名单中，则重定向到登录页面
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

// 路由后置钩子，在导航完成后调用，
router.afterEach(() => {
  // 关闭进度条
  NProgress.done()
})
